//我们把只包含质因子 2、3 和 5 的数称作丑数（Ugly Number）。求按从小到大的顺序的第 n 个丑数。 
//
// 
//
// 示例: 
//
// 输入: n = 10
//输出: 12
//解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 
//
// 说明: 
//
// 
// 1 是丑数。 
// n 不超过1690。 
// 
//
// 注意：本题与主站 264 题相同：https://leetcode-cn.com/problems/ugly-number-ii/ 
// Related Topics 数学 
// 👍 95 👎 0

package leetcode.editor.cn;
//Java：丑数
public class ChouShuLcof{
    public static void main(String[] args) {
        Solution solution = new ChouShuLcof().new Solution();

    }
    
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int nthUglyNumber(int n) {
        //动态规划
        //自底向上，不断地往上面升级，有三条路径，分别是乘以2，乘以3，乘以5，
        //比较这些的大小，顺序
        //三马在三个赛道进行赛跑，不断记录比较跑最短距离的马，让他优先进行跑，
        //不断重复，知道重复了n次
        int index2 = 0,index3 = 0, index5 = 0;
        int[] dp = new int[n];
        //初始化特殊的1
        dp[0] = 1;
        for (int i = 1; i < n; i++) {
            int n2 = dp[index2] * 2;
            int n3 = dp[index3] * 3;
            int n5 = dp[index5] * 5;
            //取三者中的最小值
            dp[i] = Math.min( Math.min( n2,n3 ), n5 );
            if (  dp[i] == n2 ){
                index2 ++;
            }
            if ( dp[i] == n3 ){
                index3 ++;
            }
            if ( dp[i] == n5 ){
                index5 ++;
            }
        }
        return dp[n-1];
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
